package com.the_last.controller;

import com.the_last.pojo.dto.AssignUserRoleDTO;
import com.the_last.pojo.dto.IncrementalUserRoleDTO;
import com.the_last.service.ISysUserRoleService;
import com.the_last.utils.Result;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户角色关系管理控制器
 * 专注于用户和角色之间的关系操作（分配、移除、批量操作等）
 * 用户角色查询功能请使用 SysRoleController#getRolesByUserId
 */
@RestController
@RequestMapping("/user-role")
@RequiredArgsConstructor
public class SysUserRoleController {
    
    private final ISysUserRoleService userRoleService;
    
    /**
     * 增量分配用户角色（推荐使用）
     * 支持同时进行角色的增加和删除操作，避免全量替换
     */
    @PostMapping("/assign-incremental")
    @PreAuthorize("hasAuthority('USER_ROLE_ASSIGN')")
    public Result<Void> incrementalAssignUserRoles(@Valid @RequestBody IncrementalUserRoleDTO incrementalDTO) {
        return userRoleService.incrementalAssignUserRoles(incrementalDTO);
    }
    
    /**
     * 移除用户角色
     */
    @DeleteMapping("/remove")
    @PreAuthorize("hasAuthority('USER_ROLE_REMOVE')")
    public Result<Void> removeRolesFromUser(@RequestParam Long userId, @RequestParam List<Long> roleIds) {
        return userRoleService.removeRolesFromUser(userId, roleIds);
    }
    
    /**
     * 获取角色的用户ID列表
     */
    @GetMapping("/role/{roleId}/users")
    @PreAuthorize("hasAuthority('USER_ROLE_QUERY')")
    public Result<List<Long>> getUserIdsByRoleId(@PathVariable Long roleId) {
        return userRoleService.getUserIdsByRoleId(roleId);
    }
    
    /**
     * 批量为用户分配角色
     */
    @PostMapping("/batch-assign")
    @PreAuthorize("hasAuthority('USER_ROLE_ASSIGN')")
    public Result<Void> batchAssignRoleToUsers(@RequestParam List<Long> userIds, @RequestParam Long roleId) {
        return userRoleService.batchAssignRoleToUsers(userIds, roleId);
    }
    
    /**
     * 清除用户所有角色
     */
    @DeleteMapping("/user/{userId}/clear")
    @PreAuthorize("hasAuthority('USER_ROLE_CLEAR')")
    public Result<Void> clearUserRoles(@PathVariable Long userId) {
        return userRoleService.clearUserRoles(userId);
    }
    
    /**
     * 检查用户是否拥有指定角色
     */
    @GetMapping("/check")
    @PreAuthorize("hasAuthority('USER_ROLE_QUERY')")
    public Result<Boolean> hasRole(@RequestParam Long userId, @RequestParam String roleCode) {
        return userRoleService.hasRole(userId, roleCode);
    }
    
}